'use strict';
require('google-code-prettify/bin/prettify.min.js');
//////////////////////////////////////////////////////////////////////////////
// 代码可视化
// =====================
// liuyp 2018年11月28日15: 30: 04
//////////////////////////////////////////////////////////////////////////////
function uiBs() {
    // 正常格式化各种代码
    function _bs1(el){
        var c = el.innerHTML,
            sp = c.match(/^[ ]*[\n|\r|\r\n]([ ]*)/),
            uiBs = sp && sp[1] && Math.floor(sp[1].length / 4) || 5
        var tagName = $(el)[0].tagName.toLowerCase()
        if (tagName == "style") {
            $(el).before("<h6><kbd><i class='glyphicon glyphicon-list-alt'></i> 样式表 </kbd></h6>");
        } else if (tagName == "script") {
            $(el).before("<h6><kbd><i class='glyphicon glyphicon-list-alt'></i> 脚本 </kbd></h6>");
        }
        var rg = new RegExp("\n" + (new Array(parseInt(uiBs)*4+1).join(" ")), "g")
        var pre = document.createElement("pre")
        pre.className="prettyprint linenums"
        var parentEl = el.parentNode;
        if(parentEl.lastChild == el){
            parentEl.appendChild(pre);
        } else {
            parentEl.insertBefore(pre, el.nextSibling)
        }
        pre.appendChild(el.cloneNode(true))
        var r = ""+(c.replace(/\n|\r|\r\n/ , "").replace(/^[ ]*|[ ]*$/g , "").replace(rg , "\n"))
        pre.innerHTML = prettyPrintOne(_String_escapeHTML(r),"",true)
    }
    // 远程读取并格式化各种文件
    function _bs2(el, uiUrl, finishFun) {
        var pre = $("<pre class='prettyprint linenums'></pre>");
        var tagName = $(el)[0].tagName.toLowerCase();
        if (tagName == "style") {
            $(el).before("<h6><kbd><i class='glyphicon glyphicon-list-alt'></i> 样式表 " + uiUrl + "</kbd></h6>");
        } else if (tagName == "script") {
            $(el).before("<h6><kbd><i class='glyphicon glyphicon-list-alt'></i> 脚本 " + uiUrl + "</kbd></h6>");
        }
        $(el).before(pre);
        $.ajax({
            url: uiUrl,
            dataType: "text",
            success: function(text) {
                var inner = _String_escapeHTML(text);
                inner = inner.replace(/(##[0-9]{6,}##flag)/g,"<span>$1</span>")
                //pre.html(prettyPrintOne(inner, "", true));
                pre.html(inner).css("padding-left","16px");
            }
        });
    }
    function _bs3(el, uiUrl){
        var pre = $("<pre></pre>");
        $(el).before(pre);
        $.ajax({ url: uiUrl , dataType: "text", success: function(text){
            var dotest = function(code){ try{ return window.eval("("+code+")") }catch(e){ console.error(code,e); return "代码错误" } };
            text = text.replace(/\_bs\((.*)\,result\_flag\_here/g,function(a,b,c){ return "测试 "+b+" 结果 "+dotest(b) })
            var code = _String_escapeHTML(text);
            pre.html(code).css("padding-left","16px");;
        }});
    }
    function _String_escapeHTML(str){
        if(null==str){return""}
        var ra = function(S,A,B){for(var i=0,l=A.length;i<l;i++){ var R=new RegExp(A[i],"g"); S=S.replace(R,"&"+B[i]+";") };return S};
        return ra(str,["&"," ",">","<","\""],["amp","nbsp","gt","lt","quot"])
    };
    return {
        restrict: 'AC',// 指令类型  E：element A：attribute M：comment C: class
        priority: 800, // 优先级，可忽略，默认为0， ngRepeat的优先级为1000，这样就可以保证在同一元素上，它总是在其他指令之前被调用。
        terminal: false,// （布尔型），true或false,如果为false,则这个参数用来告诉AngularJS停止运行当前元素上比本指令优先级低的指令。优先级相同的指令还是会被执行。 ngIf 的优先级略高于 ngView ，
        // template: '<div>我是指令生成的内容</div>';
        // replace: true, // 使用模板替换原始标记  指令内原本的数据将被清空
        link: function(scope, el, attr) {
            if(attr["xianjs"] !== undefined) _bs3(el[0], attr["file"]);
            else if(attr["file"] !== undefined) _bs2(el[0], attr["file"]);
            else _bs1(el[0]);
        }
    };
}
exports = module.exports = uiBs;